#!/usr/bin/python
# Copyright Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later

from __future__ import annotations


DOCUMENTATION = r"""
module: uptimerobot
short_description: Pause and start Uptime Robot monitoring
description:
  - This module lets you start and pause Uptime Robot Monitoring.
author: "Nate Kingsley (@nate-kingsley)"
requirements:
  - Valid Uptime Robot API Key
extends_documentation_fragment:
  - community.general.attributes
attributes:
  check_mode:
    support: none
  diff_mode:
    support: none
options:
  state:
    type: str
    description:
      - Define whether or not the monitor should be running or paused.
    required: true
    choices: ["started", "paused"]
  monitorid:
    type: str
    description:
      - ID of the monitor to check.
    required: true
  apikey:
    type: str
    description:
      - Uptime Robot API key.
    required: true
notes:
  - Support for adding and removing monitors and alert contacts has not yet been implemented.
"""

EXAMPLES = r"""
- name: Pause the monitor with an ID of 12345
  community.general.uptimerobot:
    monitorid: 12345
    apikey: 12345-1234512345
    state: paused

- name: Start the monitor with an ID of 12345
  community.general.uptimerobot:
    monitorid: 12345
    apikey: 12345-1234512345
    state: started
"""

import json
from urllib.parse import urlencode

from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.urls import fetch_url
from ansible.module_utils.common.text.converters import to_text


API_BASE = "https://api.uptimerobot.com/"

API_ACTIONS = dict(status="getMonitors?", editMonitor="editMonitor?")

API_FORMAT = "json"
API_NOJSONCALLBACK = 1
CHANGED_STATE = False
SUPPORTS_CHECK_MODE = False


def checkID(module, params):
    data = urlencode(params)
    full_uri = API_BASE + API_ACTIONS["status"] + data
    req, info = fetch_url(module, full_uri)
    result = to_text(req.read())
    jsonresult = json.loads(result)
    req.close()
    return jsonresult


def startMonitor(module, params):
    params["monitorStatus"] = 1
    data = urlencode(params)
    full_uri = API_BASE + API_ACTIONS["editMonitor"] + data
    req, info = fetch_url(module, full_uri)
    result = to_text(req.read())
    jsonresult = json.loads(result)
    req.close()
    return jsonresult["stat"]


def pauseMonitor(module, params):
    params["monitorStatus"] = 0
    data = urlencode(params)
    full_uri = API_BASE + API_ACTIONS["editMonitor"] + data
    req, info = fetch_url(module, full_uri)
    result = to_text(req.read())
    jsonresult = json.loads(result)
    req.close()
    return jsonresult["stat"]


def main():
    module = AnsibleModule(
        argument_spec=dict(
            state=dict(required=True, choices=["started", "paused"]),
            apikey=dict(required=True, no_log=True),
            monitorid=dict(required=True),
        ),
        supports_check_mode=SUPPORTS_CHECK_MODE,
    )

    params = dict(
        apiKey=module.params["apikey"],
        monitors=module.params["monitorid"],
        monitorID=module.params["monitorid"],
        format=API_FORMAT,
        noJsonCallback=API_NOJSONCALLBACK,
    )

    check_result = checkID(module, params)

    if check_result["stat"] != "ok":
        module.fail_json(msg="failed", result=check_result["message"])

    if module.params["state"] == "started":
        monitor_result = startMonitor(module, params)
    else:
        monitor_result = pauseMonitor(module, params)

    module.exit_json(msg="success", result=monitor_result)


if __name__ == "__main__":
    main()
